package com.zxy.controller;

import com.zxy.feignclients.ProductClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Random;

/**
 * @author: Zxy
 * @description:
 * @date: 2021-07-19 17:26
 */
@RestController
public class UserController {
    private final Logger log = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private DiscoveryClient discoveryClient; // 服务发现客户端调用


    @Autowired
    private LoadBalancerClient loadBalancerClient; // 负载均衡客户端


    @Autowired /* 第四种：使用带有@LoadBalanced注解的restTemplate实现调用 */
    private RestTemplate restTemplate;

    @Autowired
    private ProductClient productClient;

    @GetMapping("/invoke")
    public String invokeProduct(){
        log.info("调用用户服务，开始访问product服务");
        /*
        第一种：使用RestTemplate实现远程调用
        String str = new RestTemplate().getForObject("http://localhost:9002/product?id=21", String.class);
        */
        /*List<ServiceInstance> serviceInstances = discoveryClient.getInstances("product-client");
        serviceInstances.forEach(serviceInstance -> {
            log.info("服务主机：{}，服务端口：{}，服务uri：{}",serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getUri());
        });*/
        /*
        第二种：使用discoveryClient+RestTemplate实现远程调用
        String str=new RestTemplate().getForObject(serviceInstances.get(serviceInstances.size()-1).getUri()+"/product?id=21", String.class);
        */

        /*
        第三种：使用loadBalancerClient类+RestTemplate实现
        String str=new RestTemplate().getForObject(loadBalancerClient.choose("product-client").getUri()+"/product?id=21",String.class);
        */
        /*
        第四种：使用带@loadBalance注解的RestTemplate
        String str = restTemplate.getForObject("http://product-client/product?id=21", String.class);
        */
        /* 第五种：使用open feign组件实现服务调用，并自带了负载均衡策略 */
        String str = productClient.product(21);
        return str;
    }
}
